home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
amort4.arc
/
AMORT4.PAS
Wrap
Pascal/Delphi Source File
|
1986-09-20
|
9KB
|
235 lines
PROGRAM AMORT4; {By Bob Hunter 12-16-85, Rev. 8-12-86
Calculates mo. pmt. and produces amortization schedule
for a loan, given the amount, int. rate, and term.
Ver.2 includes PRINT option and pmt. dates.
Ver.3 includes PAYMENT ESCALATION option.
Ver.4 adds LUMP SUM PAYMENTS option, and
corrects Binary Math errors.}
VAR
INCHR : CHAR;
M,M1,P,R,I,IY,AM,
PY,TM,IM,PM,
IT,PT,LM : REAL;
L,Y,Z,Q,
C,MO,MO1,YR,G,J : INTEGER;
U,V,PR,CH,INC : CHAR;
MONTH : STRING[3];
MONTHS : STRING[36];
PRINT,INCR,LUMP : BOOLEAN;
LP : ARRAY[1..6] OF REAL; { LP[J] = LUMP PMTS.}
LZ : ARRAY[1..6] OF INTEGER; { LM[J] = MOS. LUMP PMTS. ARE MADE.}
LABEL
GO,PR1,YREND,STDOUT,
RESULTS,TOTALS,RESUME ;
FUNCTION EXPN : REAL; { Simplifying Amortization Equation }
BEGIN EXPN:= EXP(-L*Ln(1+I));END;
FUNCTION DENOM :REAL; { Simplifying Amortization Equation }
BEGIN DENOM:= (1-EXPN)/I;END;
FUNCTION NUMER : REAL; { Calculating Amortization Equation }
BEGIN NUMER:=INT((P/DENOM)*100+0.5)/100;END;{while correcting Binary errors }
PROCEDURE COMPMON; { String file of months }
BEGIN
MONTHS:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
MONTH:= COPY(MONTHS,3*MO-2,3);
END;
PROCEDURE HEADINGS;
BEGIN
WRITELN;
WRITELN(YR:11,' PMT. MONTHLY PRINCIPAL INTEREST REMAINING':50);
WRITELN('MO. NO. PAYMENT PAYMENT PAYMENT PRINCIPAL':61);
WRITELN('_______________________________________________________':62);WRITELN;
IF PRINT THEN
BEGIN
WRITELN(LST);
WRITELN(LST,YR:11,' PMT. MONTHLY PRINCIPAL INTEREST REMAINING':50);
WRITELN(LST,'MO. NO. PAYMENT PAYMENT PAYMENT PRINCIPAL':61);
WRITELN(LST,'_______________________________________________________':62);WRITELN(LST);
END;
END;
PROCEDURE CORRECT; { Corrects final payment to prevent neg. balance }
BEGIN PM:=PM+P;M:=PM+IM;P:=0;END;
PROCEDURE CORRECT1; { Corrects final LUMP payment to prevent neg. balance }
BEGIN PM:=PM+P;LM:=PM+IM;P:=0;END;
PROCEDURE LUMPOUT; { Adjusts normal monthlp pmt. to add LUMP pmt.}
BEGIN
IF (PM>P) AND (P<0) THEN CORRECT1;
IF P<=50 THEN CORRECT1;
WRITELN('*':6,MONTH:5,Z:5,' $',LM:7:2,' $',PM:7:2,' $',IM:7:2,' $',P:9:2);
IF PRINT THEN
BEGIN
WRITELN(LST,'*':6,MONTH:5,Z:5,' $',LM:7:2,' $',PM:7:2,' $',IM:7:2,' $',P:9:2);
END;
END;
BEGIN { Main Program }
GO:
C:=0;M:=0;AM:=0;M1:=0;Y:=0;MO:=0;MO1:=0;TM:=0;IT:=0;PT:=0;G:=0;J:=0;LM:=0;
CLRSCR;
WRITE(' Enter PRINCIPAL amount ==> $ ');READLN(P);WRITELN;
WRITE(' " annual INTEREST RATE ==> ');READ(R);WRITELN(' %');WRITELN;
WRITE(' " NO. of monthly payments ==> ');READ(L);WRITELN(' MOS.');WRITELN;
M:=-1;
WRITE(' " MONTHLY PMT. desired ==> $ else <RET> to COMPUTE');
GOTOXY(38,11);READLN(M);
I:=R/1200;
IF M <=0 THEN
BEGIN { Calculates monthly payment.}
M:=NUMER;
GOTOXY(38,7);WRITE(M:7:2);WRITELN(' (COMPUTED) ');
END
ELSE
BEGIN
GOTOXY(38,7);
WRITE(M:7:2);WRITELN(' ');
END;
WRITELN;
WRITE(' To CHANGE the MONTHLY PAYMENT enter NEW AMOUNT, else <RET>==> $ ');
READLN(AM);
IF AM>0 THEN M:= AM;WRITELN;
WRITE('PRESS <RET> TO CONTINUE OR `1` TO RETURN TO MENU');
READ(KBD,CH);
IF CH='1' THEN GOTO GO;WRITELN;WRITELN;
WRITE(' " YEAR loan begins ==> ');READLN(YR);WRITELN;
WRITE(' " NO. OF MONTH loan begins ==> (Example Nov. = 11) ');
GOTOXY(39,15);READ(MO);WRITELN(' ');WRITELN;
COMPMON;
WRITE(' To INCREASE the MONTHLY PAYMENT DURING TERM enter <Y>, else <RET> ');
READ(INCHR);WRITELN;
IF (INCHR='Y') OR (INCHR='y') THEN INCR:=TRUE ELSE INCR:= FALSE;
IF INCR THEN
BEGIN WRITELN;
WRITE(' Enter AMOUNT of new monthly payment ==> $ ');
READLN(M1);WRITELN;
WRITE(' Enter NO. OF PMT.(1-',L,') to start new monthly payment ==> ');
READLN(MO1);
END;
WRITELN;
WRITE(' HOW MANY LUMP SUM PAYMENTS do you wish to make ==> ');READLN(G);WRITELN;
IF G<>0 THEN LUMP:=TRUE ELSE LUMP:= FALSE;
IF LUMP THEN
BEGIN
FOR J:= 1 TO G DO
BEGIN
WRITE(' Enter NO. OF SCHEDULED PMT.(1-',L,') to add lump pmt. # ',J,' to==> ');
READLN(Q);LZ[J]:=Q;WRITELN;
WRITE(' Enter AMOUNT of lunp payment # ',J,' ==> $ ');
READLN(LP[J]);WRITELN;
END;
END;
WRITE(' If you want PRINTED OUTPUT, type <P>, else <RET> ' );READLN(PR);WRITELN;
IF (PR='P') OR (PR='p') THEN PRINT:= TRUE ELSE PRINT := FALSE;
Y:=L DIV 12;
IY:=0;PY:=0;
C:=MO-1;
CLRSCR;
WRITELN(' AMORTIZATION OF $':37,P:1:2,' LOAN');WRITELN;
WRITELN(' INTEREST RATE ':38,R:1:3,' %');WRITELN;
WRITELN(' ':19,L,' MONTHLY PAYMENTS @ $ ',M:1:2);WRITELN;
WRITELN(' STARTING ':35,MONTH,' ',YR);WRITELN;
IF LUMP THEN WRITELN(' * Indicates LUMP SUM additional payment made':55);
IF PRINT THEN
BEGIN
WRITELN(LST,' AMORTIZATION OF $':37,P:1:2,' LOAN');WRITELN(LST);
WRITELN(LST,' INTEREST RATE ':38,R:1:3,' %');WRITELN(LST);
WRITELN(LST,' ':19,L,' MONTHLY PAYMENTS @ $ ',M:1:2);WRITELN(LST);
WRITELN(LST,' STARTING ':35,MONTH,' ',YR);WRITELN(LST);
IF LUMP THEN WRITELN(LST,' * Indicates LUMP SUM additional payment made':55);
WRITELN(LST);
END;
HEADINGS;
FOR Z:=1 TO L+2 DO
BEGIN
WHILE C<12 DO
BEGIN RESULTS:
IF P=0 THEN GOTO YREND;
IF ((INCR=TRUE) AND (Z >= MO1)) THEN M:=M1; {INCREASES MONTHLY PMT. AT MO. REQUESTED}
IM:=P*I;
IM:=INT(IM*100+0.5)/100; { Correct for binary math.}
PM:=M-IM;P:=P-PM;
IF (PM>P) AND (P<0) THEN CORRECT;
IF P<=50 THEN CORRECT;
IF LUMP THEN
BEGIN
FOR J:=1 TO G DO
BEGIN
IF Z= LZ[J] THEN
BEGIN
P:=P-LP[J];PM:=PM+LP[J];LM:=M+LP[J];TM:=TM+LP[J];
LUMPOUT;GOTO RESUME;
END;
END;
END;
STDOUT:
BEGIN
WRITELN(MONTH:11,Z:5,' $',M:7:2,' $',PM:7:2,' $',IM:7:2,' $',P:9:2);
IF PRINT THEN
BEGIN
WRITELN(LST,MONTH:11,Z:5,' $',M:7:2,' $',PM:7:2,' $',IM:7:2,' $',P:9:2);
END;
END;
RESUME:
IY:=IY+IM;PY:=PY+PM;
TM:=TM+M;IT:=IT+IM;PT:=PT+PM;C:=C+1;Z:=Z+1;
MO:=MO+1;IF MO>12 THEN MO:=1;
COMPMON;
END;
YREND:
IF Z MOD 12>0 THEN YR:=YR+1;WRITELN;
WRITELN('TOTAL PAID IN ':22,YR-1,': $',PY:8:2,' $',IY:8:2);WRITELN;
IF PRINT THEN
BEGIN WRITELN(LST);
WRITELN(LST,'TOTAL PAID IN ':22,YR-1,': $',PY:8:2,' $',IY:8:2);WRITELN(LST);
END;
WRITELN;
IY:=0;PY:=0;
IF P=0 THEN GOTO TOTALS;
WRITE('PRESS <RET> TO CONTINUE OR `1` TO RETURN TO MENU');
READ(KBD,CH);
IF CH='1' THEN GOTO GO
ELSE
BEGIN WRITELN;WRITELN;
CLRSCR;
C:=0;Z:=Z-1; {TO ACCOUNT FOR Z INCREMENTING AT FOR STATEMENT}
HEADINGS;
END;
END;
BEGIN TOTALS:
WRITELN;
WRITELN('*** LOAN TOTALS: ***':44);WRITELN;
WRITELN(' TOTAL PRINCIPAL INTEREST':49);
WRITELN(' ________________________________':50);WRITELN;
WRITELN(' $':17,TM:9:2,' $',PT:8:2,' $',IT:9:2);
IF PRINT THEN
BEGIN
WRITELN(LST);
WRITELN(LST,'*** LOAN TOTALS: ***':44);WRITELN(LST);
WRITELN(LST,' TOTAL PRINCIPAL INTEREST':49);
WRITELN(LST,' ________________________________':50);WRITELN(LST);
WRITELN(LST,' $':17,TM:9:2,' $',PT:8:2,' $',IT:9:2);
END;
HALT;
END;
END.
***
INDEX OF VARIABLES:
PY=PRIN. FOR YR.
IY=INT. FOR YR